perm filename GRAPH.SAI[4,KMC] blob sn#180023 filedate 1975-10-04 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BAR graph for up to 5 dimensions and creatures
C00003 00003	α GET DATA VALUES
C00005 00004	α Calculate X_DIF specifically since there is no call to X_AXIS
C00007 00005	α Draws STREET map to my house
C00009 00006	α ATLAS plots cities on a world map
C00012 00007	α This selects the requested routine
C00013 ENDMK
C⊗;
COMMENT BAR graph for up to 5 dimensions and creatures;

BEGIN

REQUIRE "DPYDEF.SAI[SEC,RCP]" SOURCE_FILE;

PROC BAR;
	BEGIN

INTEGER J, NUMCOMP, NUMDIMS, MAX_NUM;
SAFE INTEGER ARRAY RATING[1:5,1:5];
STRING CAPT, VERTCAPTION;
SAFE STRING ARRAY COMPARED, DIMENSION[1:5];

MAX_NUM ← 5;
α GET DATA VALUES;
MIN_X ← MAX_X ← MIN_Y ← MAX_Y ← 0;
NUMCOMP ← GET_AN_INT("HOW MANY CREATURES COMPARED");
NUMCOMP ← 1 MAX NUMCOMP MIN MAX_NUM;
FOR I ← 1 TIL NUMCOMP DO
	COMPARED[I] ← GET_A_STRING("CREATURE" ∂ CVS(I));
NUMDIMS ← GET_AN_INT("HOW MANY DIMENSIONS OF COMPARISON");
NUMDIMS ← 1 MAX NUMDIMS MIN MAX_NUM;
FOR I ← 1 TIL NUMDIMS DO
	DIMENSION[I] ← GET_A_STRING("DIMENSION" ∂ CVS(I));
MAX_X ← (NUMCOMP + 1) * NUMDIMS + 1;
FOR I ← 1 TIL NUMCOMP DO
	FOR J ← 1 TIL NUMDIMS DO
		BEGIN
		RATING[I, J] ← GET_AN_INT(COMPARED[I] ∂ DIMENSION[J]);
		MAX_Y ← MAX_Y MAX RATING[I,J];
		END;

α GET CAPTIONS;
VERTCAPTION ← GET_A_STRING("WHAT DO YOU CALL THE VERTICAL SCALE");
CAPT ← GET_A_STRING("WHAT DO YOU WANT FOR A CAPTION AT THE BOTTOM");

α PREPARE FOR CHARACTER DISPLAY;
DPYSET(PLOTCOM);
CHAR_INIT(3);

α SET SIZE AND LOCATION OF GRAPH;
SCREEN_INIT(7, 4);
α Calculate X_DIF specifically since there is no call to X_AXIS;
X_DIF ← MAX_X - MIN_X;

α MARK VERTICAL AXIS;
Y_AXIS;

α DRAW BORDER;
BOX(MIN_X, MIN_Y, X_DIF, Y_DIF, 0);

α VERTICAL CAPTION;
VERT_CAPTION(VERTCAPTION, 7, MAX_Y, MIN_Y);

α MOVE BELOW GRAPH FOR CAPTION;
FOR I ← 1 TIL NUMDIMS DO
	CAPTION(DIMENSION[I], (I-1)*NUMCOMP + I, I*NUMCOMP + I, 2);
CHAR_INIT(CHAR_SIZE + 1);
CAPTION(CAPT, MIN_X, MAX_X, 4);
CHAR_INIT(CHAR_SIZE - 1);

α MOVE TO UPPER AREA FOR LEGEND;
FOR I ← 1 TIL NUMCOMP DO
	BEGIN
	BOX(1, MAX_Y - I * Y_DIF DIV 10, 1, Y_DIF DIV 12, I);
	TEXT(COMPARED[I], 3, MAX_Y - I * Y_DIF DIV 10);
	END;

α DRAW ALL BARS;
FOR I ← 1 TIL NUMDIMS DO
	FOR J ← 1 TIL NUMCOMP DO
		BOX((I-1)*(NUMCOMP+1) + J, MIN_Y, 1, RATING[J,I], J);

α DISPLAY THE BAR GRAPH;
DISPLAY("BAR");
	END;
α Draws STREET map to my house;

PROC STREET_MAP;
	BEGIN

	MIN_X ← -505;
	MAX_X ← 505;
	MIN_Y ← -405;
	MAX_Y ← 405;
	X_DIF ← MAX_X - MIN_X;
	Y_DIF ← MAX_Y - MIN_Y;

	α PREPARE FOR CHARACTER DISPLAY;
	DPYSET(PLOTCOM);
	CHAR_INIT(3);
	SCREEN_INIT(0, 0);

	TEXT("Saturday, Oct 26", 100, -20);
	TEXT("7:30 pm", 100, -40);
	TEXT("545 Pettis Ave", 100, -60);
	TEXT("968 - 9761", 100, -80);

	STREET(100, 0, CHAR_X - 90, 214, -90, 214, "x");

	STREET(-505, 400, 505, 400, -400, 400, "101");
	STREET(-350, 240, 155, 240, -350, 240, "CALIFORNIA");
	STREET(-140, 225,  20, 225, 20, 220, "MERCY");
	STREET(-140, 210,  20, 210, 20, 205, "LATHAM");
	STREET(-100, 195, -20, 195, -20, 190, "SNOW");
	STREET(-505, 180, 505, 180, -420, 180, "EL CAMINO");
	STREET(-505, -60, 505, -260, -400, -100, "FOOTHILL");
	STREET(-505,-340, 505, -340, -400, -340, "280");
	STREET(-500, 405,-500, -400, -505, 60, "ARASTRADERO");
	STREET(- 90, 405,   0, 80, -150, 350, "STIERLIN-BAILEY");
	STREET(-110, 280, -80, 180, -140, 270, "PETTIS");
	STREET(-140, 180, -40, 0, -60, 40, "SPRINGER");
	STREET(-100, 108,-100, -400, -140, -40, "EL MONTE");
	STREET( 100, 405, 505, -60, 395, 80, "85");
	DISPLAY("STREET");
	END;
α ATLAS plots cities on a world map;

PROC ATLAS;
	BEGIN
	SAFE STRING ARRAY WORDS [1:300];
	SAFE INTEGER ARRAY LATS [1:300, 0:1];
	INTEGER SIZE, MAX_SIZE, NEAR;
	STRING NEXT;
	MAX_SIZE ← 300;
	BREAK_TAB;
	BREAK_EXT;
	FILIN((FILE ← GET_A_STRING("Plot which ATLAS")), INCH1);
	SIZE ← 0;
	MIN_X ← 180;
	MAX_X ← -180;
	MIN_Y ← 90;
	MAX_Y ← -90;
	NEXT ← IN_LINE;
	WHILE ¬EOF AND (SIZE < MAX_SIZE) DO
	IF NEXT THEN
		BEGIN
		SIZE ← SIZE + 1;
		WORDS[SIZE] ← SCAN(NEXT, 3, BRK);
		LATS[SIZE, 0] ← SCAN_LONG(NEXT);
		MIN_X ← MIN_X MIN LATS[SIZE, 0];
		MAX_X ← MAX_X MAX LATS[SIZE, 0];
		LATS[SIZE, 1] ← SCAN_LAT(NEXT);
		MIN_Y ← MIN_Y MIN LATS[SIZE, 1];
		MAX_Y ← MAX_Y MAX LATS[SIZE, 1];
		NEXT ← IN_LINE;
		END
	ELSE NEXT ← IN_LINE;
	IF ¬EOF THEN OUTSTR("Only first" ∂ CVS(MAX_SIZE) ∂ "cities plotted." ↓)
	ELSE OUTSTR("There were" ∂ CVS(SIZE) ∂ "cities." ↓);
	RELEASE(INCH1);

	DPYSET(PLOTCOM);
	CHAR_INIT(2);
	SCREEN_INIT(9, 7);
	Y_AXIS;
	X_AXIS;
	BOX(MIN_X, MIN_Y, X_DIF, Y_DIF, 0);
	VERT_CAPTION("NORTH", 7, 90, 0);
	VERT_CAPTION("SOUTH", 7, 0, -90);
	VERT_CAPTION("LATITUDE", 9, 90, -90);
	CAPTION("WEST", -180, 0, 5);
	CAPTION("EAST", 0, 180, 5);
	CAPTION("LONGITUDE", -180, 180, 7);
	NEAR ← GET_AN_INT("Connect neighbors within __ degrees");
	FOR I ← 1 TIL SIZE DO
		BEGIN
		INTEGER LOOK, BEST;
		TEXT(WORDS[I][1 TO 1], LATS[I, 0], LATS[I, 1]);
		BEST ← NEAR + 1;
		FOR LOOK ← 1 TIL SIZE DO
			IF LOOK ≠ I THEN
			BEST ← BEST MIN (ABS(LATS[I,0] - LATS[LOOK,0]) +
				ABS(LATS[I,1] - LATS[LOOK,1]));
		IF BEST ≤ NEAR THEN
		FOR LOOK ← 1 TIL SIZE DO
			IF BEST = (ABS(LATS[I,0] - LATS[LOOK,0]) +
				ABS(LATS[I,1] - LATS[LOOK,1])) THEN
			LINE(LATS[I,0], LATS[I,1], LATS[LOOK,0], LATS[LOOK,1]);
		END;
	DISPLAY(SCAN(FILE, 7, BRK));
	END;
α This selects the requested routine;

WHILE TRUE DO
	BEGIN
	STRING JOB;
	BREAK_LINE;
	JOB ← GET_A_STRING("Bar graph, Street map, Atlas, Display, eXit");
	     IF JOB = "B" THEN BAR
	ELSE IF JOB = "S" THEN STREET_MAP
	ELSE IF JOB = "A" THEN ATLAS
	ELSE IF JOB = "D" THEN DISPLAY(NULL)
	ELSE IF JOB = "X" THEN DONE
	ELSE OUTSTR("You blew it" ↓);
	END;

END